#include <mutex>
class Singleton
{
public:
	Singleton* GetInstance();

	class CGarbo
	{
	public:
		~CGarbo()
		{
			if(Singleton::p)
				delete Singleton::p;
		}
	};
	static CGarbo garbo;//定义一个静态成员变量，程序结束时，系统会自动调用它的析构函数从而释放单例对象

private:
	static Singleton* p;
	Singleton() = default;
	std::mutex mutex_;// new
};
Singleton* Singleton::p = nullptr;


Singleton* Singleton::GetInstance() {
	if(p == nullptr)
	{
		std::lock_guard<std::mutex> lk(mutex_);
		if(p == nullptr)	//第二次检查是必要，因为就像我们刚刚看到的，很有可能另一个线程偶然在第一次检查之后，获得锁成功之前初始化p。
			//p = new Singleton();	//可能存在内存读写的乱序执行（编译器问题）
		{
			Singleton *tmp = static_cast<Singleton*>(operator new(sizeof(Singleton)));//分配内存
			new(tmp)Singleton();//构造对象
			p = tmp;//令p指向

		}
	}
	return p;
}